#include "bitband.h"
#include "ldt.h"
#include "delay.h"

#define HC138_A0	PCOut(11)
#define HC138_A1	PCOut(12)
#define HC138_A2	PDOut(2)
#define HC595_DS	PBOut(3)
#define HC595_SCLK	PBOut(5)
#define HC595_LCLK	PBOut(4)

void ldt_init(void)
{
	GPIO_InitTypeDef gpio_value;
	
	// 使能时钟
	// !!!!注意 关闭JTAG功能，需要使能AFIO总线
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | \
	RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | \
	RCC_APB2Periph_AFIO, ENABLE);
	
	// 关闭JTAG功能
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
	
	// 初始化GPIO 
	gpio_value.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
	gpio_value.GPIO_Mode = GPIO_Mode_Out_PP;// 推挽输出
	gpio_value.GPIO_Speed = GPIO_Speed_50MHz; // 速率
	GPIO_Init(GPIOB, &gpio_value);
	
	gpio_value.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
	GPIO_Init(GPIOC, &gpio_value);
	
	gpio_value.GPIO_Pin = GPIO_Pin_2;
	GPIO_Init(GPIOD, &gpio_value);
	
	delay_init();
}

// 位选
static void hc138_select_ldt(u8 no)
{
	// no 0  1  2  3 
	switch(no) {
		case 0:
			HC138_A0 = 0;
			HC138_A1 = 0;
			HC138_A2 = 0;
			break;
		case 1:
			HC138_A0 = 1;
			HC138_A1 = 0;
			HC138_A2 = 0;
			break;
		case 2:
			HC138_A0 = 0;
			HC138_A1 = 1;
			HC138_A2 = 0;
			break;
		case 3:
			HC138_A0 = 1;
			HC138_A1 = 1;
			HC138_A2 = 0;
			break;
		default:
			break;
	}
}

static void hc595_select_section(u8 num)
{
	u8 i;
	u8 datas[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
	
	// 将num每一位通过DS写入芯片
	for (i = 0; i < 8; i++) {
		HC595_SCLK = 0;
		if (datas[num] & 0x80)
			HC595_DS = 1;
		else
			HC595_DS = 0;
		datas[num] <<= 1;
		HC595_SCLK = 1;
	}
	
	// 芯片移位寄存器的数据放到存储寄存器
	HC595_LCLK = 0;
	HC595_LCLK = 1;
}

void ldt_show_number(u16 data, u16 ms)
{
	/*
		将data每一位求出来
		1234
		1
		2
		3
		4
		位选
		段选
	*/
	u8 buf[4] = {0}; // buf[0]存储数据个位 buf[1]存数数据十位
	u8 i;
	
	i = 0;
	while (data) {
		buf[i++] = data % 10;
		data /= 10;
	}
	
	while (ms--) {
		for (i = 0; i < 4; i++) {
			// 位选
			hc138_select_ldt(i);
			// 段选
			hc595_select_section(buf[3 - i]);
			delay_ms(1);
			ms--;
		}
		delay_ms(1);
	}
}



